package org.lestr.secuel.m3ds.importation.objets3D;

import java.io.File;

import java.util.HashMap;
import java.util.Map;
import org.lestr.secuel.m3ds.IUsine;
import org.lestr.secuel.m3ds.objets3D.IObjet3d;


public class ImportateursObjet3d {

	
	// Variables statiques
	private static ImportateursObjet3d singleton;
	
	
	/** Retourne le singleton */
	public static synchronized ImportateursObjet3d getSingleton(){
	
		// Initialise le singleton si besoin
		if(singleton == null){
			
			// Instanciation
			singleton = new ImportateursObjet3d();
			
			// Ajout des importateurs
			singleton.ajoutImportateur(new ImportateurWavefront());
			
		}
		
		// Retourne le singleton
		return singleton;
		
	}// FIN retSingleton
	
	
	// Déclaration des attributs
	private Map<String, ImportateurObjet3d> importateurs;
	
	
	/** Constructeur privé (patron singleton) */
	private ImportateursObjet3d(){
		
		// Instanciation des attributs
		importateurs = new HashMap<String, ImportateurObjet3d>();
		
	}// FIN Constructeur
	
	
	/** Ajoute un importateur d'image */
	public void ajoutImportateur(ImportateurObjet3d importateur){
		
		importateurs.put(importateur.getFormatExtension(), importateur);
		
	}// FIN ajoutImportateur
	
	
	/** Retourne le liste des extensions importées */
	public Iterable<String> getFormatsExtensions(){
		
		return importateurs.keySet();
		
	}// FIN retFormatsExtensions
	
	
	/** Importe les objets 3D d'un fichier */
	public Iterable<IObjet3d> importer(File fichier, IUsine usine) throws ExceptionImportObjet3d {
		
		// Récupère l'extension
		String extension = fichier.getName();
		if(extension.lastIndexOf(".") != 0 && extension.lastIndexOf(".") + 1 <= extension.length() - 1)
			extension = extension.substring(extension.lastIndexOf(".") + 1);
		else
			throw(new ExceptionImportObjet3d());
		
		// S'il y a un importateur existant
		if(importateurs.containsKey(extension)){
			
			// Importe le fichier
			return importateurs.get(extension).importer(fichier, usine);
			
		}
		else
			throw(new ExceptionImportObjet3d());
		
	}// FIN importer
	
	
}// FIN Classe
